﻿// =============================================
// 文件保护宏：防止该头文件被重复包含（避免编译错误）
// 如果尚未定义 CUSTOM_LIGHTING_INCLUDED，则定义它并继续，否则跳过
// =============================================
#ifndef CUSTOM_LIGHTING_INCLUDED
#define CUSTOM_LIGHTING_INCLUDED

// =============================================
// 函数：IncomingLight
// 作用：计算单个光源对物体表面的 **入射光强度（即漫反射部分的初始贡献）**
// 参数：
//   - surface：包含法线、视角方向等信息的表面结构体
//   - light：包含颜色和方向的单个光源
// 返回值：float3，表示该光源对表面的入射光颜色强度（未考虑 BRDF 高光等）
// =============================================
float3 IncomingLight(Surface surface, Light light) {
	// 计算表面法线与光源方向的点积，得到光线与表面夹角的余弦值（即 N·L）
	// saturate(x) 用于将结果限制在 [0, 1] 范围内，避免背面受光或点积为负
	// 然后乘以光源颜色 light.color，得到该方向上的入射光强度
	return saturate(dot(surface.normal, light.direction)) * light.color;
}

// =============================================
// 函数：GetLighting (重载1)
// 作用：计算单个光源对表面的 **最终直接光照颜色贡献**
// 即：入射光强度 × BRDF 模型计算出的综合反射颜色（漫反射 + 镜面反射）
// 参数：
//   - surface：表面信息（法线、颜色、视角方向等）
//   - brdf：双向反射分布函数信息（漫反射、镜面反射、粗糙度）
//   - light：单个光源信息（颜色、方向）
// 返回值：float3，该光源对表面的最终光照颜色
// =============================================
float3 GetLighting(Surface surface, BRDF brdf, Light light) {
	// 入射光强度（N·L * 光源颜色）乘以 BRDF 模型计算的综合反射颜色
	// 即：光照强度 × (漫反射 + 镜面反射)
	return IncomingLight(surface, light) * DirectBRDF(surface, brdf, light);
}

// =============================================
// 函数：GetLighting (重载2)
// 作用：计算 **所有定向光源（通过 GetDirectionalLightCount 和 GetDirectionalLight 访问）**
// 对该表面的 **累计直接光照颜色**
// 参数：
//   - surface：表面信息
//   - brdf：BRDF 数据（漫反射、镜面反射、粗糙度）
// 返回值：float3，所有定向光源的累计光照颜色总和
// =============================================
float3 GetLighting(Surface surface, BRDF brdf) {
	// 初始化累计颜色为黑色（0,0,0）
	float3 color = 0.0;

	// 循环遍历当前所有有效的定向光源（数量由 GetDirectionalLightCount() 决定）
	for (int i = 0; i < GetDirectionalLightCount(); i++)
	{
		// 获取第 i 个定向光源
		Light light = GetDirectionalLight(i);

		// 计算该光源对表面的光照贡献，并累加到总颜色中
		color += GetLighting(surface, brdf, light);
	}

	// 返回所有定向光源累计的光照颜色
	return color;
}

// =============================================
// 文件保护宏结束
// =============================================
#endif